#include<bits/stdc++.h>
#define int long long
using namespace std;
inline bool isprime(int x){
  for(int i=2;i*i<=x;i++)
    if(!(x%i))return false;
  return true;
}
pair<int,int> exgcd(int a,int b){
  if(!b)return make_pair(1,0);
  int x,y; tie(x,y)=exgcd(b,a%b);
  int t=x; x=y,y=t-a/b*y;
  return make_pair(x,y);
}
inline int inv_cp(int x,int p){
  if(__gcd(x,p)>1)return -1;
  return (exgcd(x,p).first%p+p)%p;
}
inline int qpow(int a,int b,int p){
  int r=1;
  while(b){
    if(b&1)(r*=a)%=p;
    (a*=a)%=p,b>>=1;
  }
  return r;
}
inline int inv_p(int x,int p){
  return qpow(x,p-2,p);
}
main(){
  freopen("string.in","r",stdin);
  freopen("string.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,q,p; cin>>n>>q>>p;
  auto add=[&](int x,int y){
    int s=x+y; if(s>=p)s-=p; return s;
  };
  vector<int> a(n);
  for(auto &i:a)cin>>i;
  bool B=isprime(p);
  while(q--){
    int op,x,c=0; cin>>op>>x;
    if(op==1){
      if(max(n,q)<=3000){
        for(int i=0;i<n;i++){
          /**/{
            int y=a[i]*add(1,p-x)%p; c++;
            auto check=[&](int l,int r){
              if(add(a[l]*x%p,y)!=a[r])return false;
              if(add(a[r]*x%p,y)!=a[l])return false;
              return true;
            };
            for(int j=1;i+j<n;j++)
              if(check(i-j,i+j))c++;
              else break;
          }
          if(i){
            int y=add(a[i],p-a[i-1]*x%p);
            auto check=[&](int l,int r){
              if(add(a[l]*x%p,y)!=a[r])return false;
              if(add(a[r]*x%p,y)!=a[l])return false;
              return true;
            };
            for(int j=1;i+j<=n;j++)
              if(check(i-j,i+j-1))c++;
              else break;
          }
        }
      }
      else{
        c=n;
        for(int i=1;i<n;i++){
          int y=add(a[i-1],p-a[i]*x%p);
          if(add(a[i-1]*x%p,y)==a[i])c++;
        }
      }
    }
    else{
      int y=x;
      if(max(n,q)<=20){ // OK
        for(int x=0;x<p;x++){
          auto check=[&](int l,int r){
            if(add(a[l]*x%p,y)!=a[r])return false;
            if(add(a[r]*x%p,y)!=a[l])return false;
            return true;
          };
          for(int i=0;i<n;i++){
            /**/{
              for(int j=0;i+j<n;j++)
                if(check(i-j,i+j))c++;
                else break;
            }
            if(i){
              for(int j=1;i+j<=n;j++)
                if(check(i-j,i+j-1))c++;
                else break;
            }
          }
        }
      }
      else if(n<=3000&&B){ // OK
        for(int i=0;i<n;i++){
          if(a[i]){
            int x=add(1,p-y*inv_p(a[i],p)%p); c++;
            auto check=[&](int l,int r){
              if(add(a[l]*x%p,y)!=a[r])return false;
              if(add(a[r]*x%p,y)!=a[l])return false;
              return true;
            };
            for(int j=1;i+j<n;j++)
              if(check(i-j,i+j))c++;
              else break;
          }
          else if(!y){
            int x=0; c+=p; bool f=true;
            auto check=[&](int l,int r)->int{
              if(f){
                if(!a[l]&&!a[r])return p;
                else x=min(a[l],a[r])*inv_p(max(a[l],a[r]),p)%p,f=false;
              }
              if(add(a[l]*x%p,y)!=a[r])return false;
              if(add(a[r]*x%p,y)!=a[l])return false;
              return true;
            };
            for(int j=1;i+j<n;j++){
              int r=check(i-j,i+j);
              if(r)c+=r;
              else break;
            }
          }
          if(i){
            if(a[i]||a[i-1]){
              int x=(min(a[i],a[i-1])-y+p)*inv_p(max(a[i],a[i-1]),p)%p;
              auto check=[&](int l,int r){
                if(add(a[l]*x%p,y)!=a[r])return false;
                if(add(a[r]*x%p,y)!=a[l])return false;
                return true;
              };
              for(int j=1;i+j<=n;j++)
                if(check(i-j,i+j-1))c++;
                else break;
            }
            else if(!y){
              int x=0; bool f=true;
              auto check=[&](int l,int r)->int{
                if(f){
                  if(!a[l]&&!a[r])return p;
                  else x=min(a[l],a[r])*inv_p(max(a[l],a[r]),p)%p,f=false;
                }
                if(add(a[l]*x%p,y)!=a[r])return false;
                if(add(a[r]*x%p,y)!=a[l])return false;
                return true;
              };
              for(int j=1;i+j<=n;j++){
                int r=check(i-j,i+j-1);
                if(r)c+=r;
                else break;
              }
            }
          }
        }
      }
      else{
        for(int i=0;i<n;i++){
          int d=add(1,p-a[i]);
          if(__gcd(d/__gcd(d,y),p)==1)c++;
        }
      }
    }
    cout<<c<<'\n';
  }
  return 0;
}